#include <stdlib.h>
#include <stdio.h>
#include "Liste.h"

void initialise(Liste * l)
{
	(*l).prem=NULL;
	(*l).last=NULL;
}

int estVide(const Liste * l)
{
	if(l->prem==NULL)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

unsigned int nbElements(const Liste * l)
{
	int i=0;
	Cellule * C=l->prem;
	while (C != NULL)
	{
		i=i + 1;
		C=C->suivant;
	}
		return i;
}

void ajoutEnTete(void * e,Liste * l)
{
	Cellule * tmp;
	tmp=(Cellule*)malloc(sizeof(Cellule));
	tmp->suivant=l->prem;
	if(estVide(l))
	{
		l->last=tmp;
	}
	else
	{
		(l->prem)->precedent=tmp;
	}
	tmp->precedent=NULL;
	tmp->info=e;
	l->prem=tmp;
}

void ajoutEnQueue(void * e, Liste * l)
{
	if (estVide(l))
	{
		ajoutEnTete(e,l);
	} 
	else
	{
		Cellule * tmp;
		tmp=(Cellule*)malloc(sizeof(Cellule));
		tmp->precedent=l->last;
		tmp->suivant=NULL;
		tmp->info=e;
		(l->last)->suivant=tmp;
		l->last=tmp;
	}
}

void suppressionEnTete(Liste * l)
{
	if(l->prem != NULL)
	{
	Cellule * tmp=l->prem;
	l->prem=tmp->suivant;
	tmp->precedent=NULL;
	free(tmp);
	}
	if(estVide(l))
	{
		l->last=NULL;
	}
}

void videListe(Liste * l)
{
	while(l->prem != NULL)
	{
		suppressionEnTete(l);
	}
}

void testament(Liste * l)
{
	videListe(l);
}
/*
void affichageListeGaucheDroite(const Liste * l)
{
	Cellule * C = l->prem;
	while(C != NULL)
	{
	afficheElement(C->info);
	C=C->suivant;
	}
}

void affichageListeDroiteGauche(const Liste * l)
{
	Cellule * C = l->last;
	while(C != NULL)
	{
	afficheElement(C->info);
	C=C->precedent;
	}
}
*/
void inverse_liste( Liste * l)
{
	Cellule * pred = (l->prem)->suivant;
	Cellule * p = pred->suivant;
	Cellule *suiv;
	(l->prem)->suivant=NULL;
	pred->suivant=l->prem;
	suiv=p->suivant;
	while( p != NULL)
	{
		if(p->suivant == NULL) l->prem=p;
		p->suivant=pred;
		pred=p;p=suiv;suiv=suiv->suivant;
	}
	
}

void fusion (Liste * l1, Liste * l2)
{	
	Cellule * p1, * p2, * s1, * s2;
	if((l1->prem!=0)&&(l2->prem!=0))
	{
		p1=l1->prem; p2=l2->prem;
		if((p1->info) < (p2->info))
		{
			
			s1=p1->suivant;
			s2=p2;
			p1->suivant=p2;
		}
		if(p2->info < p1->info)
		{
		
			s1=p1;
			s2=p2->suivant;
			p2->suivant=p1;
			l1->prem=p2;
		}
	
	
	while((s1!=NULL)&&(s2!=NULL))
	{
	printf("lol");
		if(s1->info > s2->info)
		{
			p2=s2;
			s2=s2->suivant;
			p2->suivant=s1;
		}	
		if(s1->info < s2-> info)
		{
			p1=s1;
			s1=s1->suivant;
			p1->suivant=s2;
		}
	}
}
}
